WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ํ์ํ์ฌ ๋ ๋๋ง์ ์ต์ ํํ์ธ์. ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์์ฑ ํ ์คํธ์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ํด ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ: ๊ฐ์์ฑ ํ ์คํธ ๋ฐ ์ฑ๋ฅ ์ต์ ํ
WebGL ๊ฐ๋ฐ ์์ญ์์ ์ฑ๋ฅ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์๋ง์ ๊ฐ์ฒด๊ฐ ์๋ ๋ณต์กํ ์ฅ๋ฉด์ GPU์ ๋น ๋ฅด๊ฒ ๋ถ๋ด์ ์ฃผ์ด ํ๋ ์ ๋๋กญ๊ณผ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ค ํ๋๋ ์คํด๋ฃจ์ ์ปฌ๋ง(occlusion culling)์ผ๋ก, ๋ค๋ฅธ ๊ฐ์ฒด ๋ค์ ์จ๊ฒจ์ง ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ง ์์ ๊ท์คํ ์ฒ๋ฆฌ ์๊ฐ์ ์ ์ฝํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๊ฐ์ฒด์ ๊ฐ์์ฑ์ ํจ์จ์ ์ผ๋ก ํ๋จํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ํจ๊ณผ์ ์ธ ์คํด๋ฃจ์ ์ปฌ๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ํน์ ๋ ๋๋ง ๋ช ๋ น ์งํฉ์ ์ํด ๋ช ๊ฐ์ ํ๋๊ทธ๋จผํธ(ํฝ์ )๊ฐ ๊ทธ๋ ค์ก๋์ง GPU์ ๋ฌผ์ด๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ๊ฐ์ฒด์ ๋ํ ๋๋ก์ฐ ์ฝ์ ์ ์ถํ๋ฉด GPU๋ ํด๋น ํ๋๊ทธ๋จผํธ ์ค ์ผ๋ถ๊ฐ ๊น์ด ํ ์คํธ๋ฅผ ํต๊ณผํ์ฌ ์ค์ ๋ก ๋ณด์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋๋ค. ์ด ์ ๋ณด๋ ํด๋น ๊ฐ์ฒด๊ฐ ์ฅ๋ฉด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด ๊ฐ๋ ค์ก๋์ง(occluded) ํ๋จํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ๊ฐ 0(๋๋ ๋งค์ฐ ์์ ์)์ ๋ฐํํ๋ฉด, ์ด๋ ๊ฐ์ฒด๊ฐ ์์ ํ(๋๋ ๊ฑฐ์) ๊ฐ๋ ค์ก์์ ์๋ฏธํ๋ฉฐ ํ์ ํ๋ ์์์ ๋ ๋๋งํ ํ์๊ฐ ์๋ค๋ ๋ป์ ๋๋ค. ์ด ๊ธฐ์ ์ ํนํ ๋ณต์กํ ์ฅ๋ฉด์์ ๋ ๋๋ง ๋ถํ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์๋ ๋ฐฉ์: ๊ฐ๋ตํ ๊ฐ์
- ์ฟผ๋ฆฌ ๊ฐ์ฒด ์์ฑ: ๋จผ์
gl.createQuery()๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค. - ์ฟผ๋ฆฌ ์์:
gl.beginQuery(gl.ANY_SAMPLES_PASSED, query)๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ํฉ๋๋ค.gl.ANY_SAMPLES_PASSED๋์์ ์ํ(ํ๋๊ทธ๋จผํธ) ์ค ํ๋๋ผ๋ ๊น์ด ํ ์คํธ๋ฅผ ํต๊ณผํ๋์ง ์ฌ๋ถ์ ๊ด์ฌ์ด ์์์ ์ง์ ํฉ๋๋ค.gl.ANY_SAMPLES_PASSED_CONSERVATIVE(๋ ๋์ ์ฑ๋ฅ์ ์ํด ์์์ฑ(false positive)์ ํฌํจํ ์ ์๋ ๋ ๋ณด์์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณต) ๋ฐgl.SAMPLES_PASSED(๊น์ด ํ ์คํธ๋ฅผ ํต๊ณผํ ์ํ ์๋ฅผ ๊ณ์ฐํ๋ฉฐ WebGL2์์๋ ์ฌ์ฉ๋์ง ์์)์ ๊ฐ์ ๋ค๋ฅธ ๋์๋ ์กด์ฌํฉ๋๋ค. - ์ ์ฌ์ ์ผ๋ก ๊ฐ๋ ค์ง ๊ฐ์ฒด ๋ ๋๋ง: ๊ทธ๋ฐ ๋ค์ ๊ฐ์์ฑ์ ํ ์คํธํ๋ ค๋ ๊ฐ์ฒด์ ๋ํ ๋๋ก์ฐ ์ฝ์ ๋ฐํํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ํ๋ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ ๊ฐ์ฒด์ ๊ฑฐ์น ํํ์ ๋๋ค. ๋จ์ํ๋ ๋ฒ์ ์ ๋ ๋๋งํ๋ฉด ์ฟผ๋ฆฌ ์์ฒด์ ์ฑ๋ฅ ์ํฅ์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ ์ข
๋ฃ:
gl.endQuery(gl.ANY_SAMPLES_PASSED)๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํฉ๋๋ค. - ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฒ์: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. GPU๊ฐ ๋ ๋๋ง ๋ช
๋ น์ ์ฒ๋ฆฌํ๊ณ ํต๊ณผํ ํ๋๊ทธ๋จผํธ ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์๊ฐ์ด ํ์ํฉ๋๋ค.
gl.getQueryParameter(query, gl.QUERY_RESULT)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. - ๊ฒฐ๊ณผ ํด์: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ 0๋ณด๋ค ํฌ๋ฉด ๊ฐ์ฒด์ ํ๋๊ทธ๋จผํธ๊ฐ ์ ์ด๋ ํ๋ ์ด์ ๋ณด์๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด ๊ฐ์ฒด๊ฐ ์์ ํ ๊ฐ๋ ค์ก๋ค๋ ์๋ฏธ์ ๋๋ค.
- ์คํด๋ฃจ์ ์ปฌ๋ง์ ๊ฒฐ๊ณผ ์ฌ์ฉ: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํ์ ํ๋ ์์์ ์์ ํ๊ณ ์์ธํ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์คํด๋ฃจ์ ์ฟผ๋ฆฌ ์ฌ์ฉ์ ์ด์
- ๋ ๋๋ง ์ฑ๋ฅ ํฅ์: ๊ฐ๋ ค์ง ๊ฐ์ฒด์ ๋ ๋๋ง์ ํผํจ์ผ๋ก์จ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋ ๋๋ง ๋ถํ๋ฅผ ํฌ๊ฒ ์ค์ฌ ๋ ๋์ ํ๋ ์ ์๋์ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- GPU ๋ถํ ๊ฐ์: ๋ ๋๋ง์ด ์ค์ด๋ค๋ฉด GPU์ ์์ ๋์ด ์ค์ด๋ค์ด ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ ํฅ์์ํค๊ณ ๋ฐ์คํฌํฑ ์ปดํจํฐ์ ๋ฐ์ด์ ์ค์ผ ์ ์์ต๋๋ค.
- ์๊ฐ์ ์ถฉ์ค๋ ํฅ์: ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํจ์ผ๋ก์จ ํ๋ ์ ์๋๋ฅผ ํฌ์ํ์ง ์๊ณ ๋ ๋ ๋ณต์กํ ์ฅ๋ฉด์ ๋ ๋์ ๋ํ ์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ์ฅ๋ฉด ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฑ๋ฅ ์ด๋์ด ์ปค์ง๋ฏ๋ก ๊ฐ์ฒด ์๊ฐ ๋ง์ ๋ณต์กํ ์ฅ๋ฉด์ ํนํ ์ ์ฉํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๊ณผ์ ์ ๊ณ ๋ ค์ฌํญ๋ ์์ต๋๋ค:
- ์ง์ฐ ์๊ฐ(Latency): ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฆ์ ์ ๊ณต๋์ง ์๊ธฐ ๋๋ฌธ์ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ์ง์ฐ ์๊ฐ์ ๋ฐ์์ํต๋๋ค. GPU๋ ๋ ๋๋ง ๋ช ๋ น์ ์ฒ๋ฆฌํ๊ณ ํต๊ณผํ ํ๋๊ทธ๋จผํธ ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์๊ฐ์ด ํ์ํฉ๋๋ค. ์ด ์ง์ฐ ์๊ฐ์ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์๊ฐ์ ๊ฒฐํจ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ ์ค๋ฒํค๋: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ ์์ฒด์๋ ์ผ์ ๋์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค. GPU๋ ์ฟผ๋ฆฌ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๊น์ด ํ ์คํธ๋ฅผ ํต๊ณผํ ํ๋๊ทธ๋จผํธ ์๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ์ด ์ค๋ฒํค๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ์ด์ ์ ์์ํ ์ ์์ต๋๋ค.
- ๋ณด์์ ์คํด๋ฃจ์ : ์ง์ฐ ์๊ฐ์ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด ๋ณด์์ ์คํด๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ๋ฐ๋์งํฉ๋๋ค. ์ด๋ ์์ฃผ ์ ์ ์์ ํ๋๊ทธ๋จผํธ๋ง ๋ณด์ด๋๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ก ์ธํด ๋ถ๋ถ์ ์ผ๋ก ๊ฐ๋ ค์ง ๊ฐ์ฒด๊ฐ ๋ ๋๋ง๋ ์ ์์ง๋ง, ๊ณต๊ฒฉ์ ์ธ ์คํด๋ฃจ์ ์ปฌ๋ง์์ ๋ฐ์ํ ์ ์๋ ์๊ฐ์ ๊ฒฐํจ์ ํผํ ์ ์์ต๋๋ค.
- ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ ์ ํ: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ(์: ๋ฐ์ด๋ฉ ๋ฐ์ค, ๋ฐ์ด๋ฉ ์คํผ์ด)์ ์ ํ์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ ๋จ์ํ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ๋ ๋๋ง์ด ๋น ๋ฅด์ง๋ง ์์์ฑ(์ฆ, ๋๋ถ๋ถ ๊ฐ๋ ค์ก์์๋ ๋ถ๊ตฌํ๊ณ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ๊ฐ์ฒด)์ด ๋ ๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋๊ธฐํ: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด CPU์ GPU ๊ฐ์ ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค. ์ด ๋๊ธฐํ๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ง์ฐ(stall)์ ์ ๋ฐํ์ฌ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ฐ ํ๋์จ์ด ํธํ์ฑ: ๋์ ๋ธ๋ผ์ฐ์ ์ ํ๋์จ์ด๊ฐ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋๋ฆฌ ์ง์๋์ง๋ง, ์ค๋๋ ์์คํ ์๋ ์ด ๊ธฐ๋ฅ์ด ์์ ์ ์์ด ๋์ฒด ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์ด์ ์ ๊ทน๋ํํ๊ณ ๊ณผ์ ๋ฅผ ์ต์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
1. ๋จ์ํ๋ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ ์ฌ์ฉ
์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์์ ํ๊ณ ์์ธํ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ๋์ , ๋ฐ์ด๋ฉ ๋ฐ์ค๋ ๋ฐ์ด๋ฉ ์คํผ์ด์ ๊ฐ์ ๋จ์ํ๋ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ๋ ๋๋งํ์ญ์์ค. ์ด๋ ๋ ๋๋ง ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฟผ๋ฆฌ ํ๋ก์ธ์ค์ ์๋๋ฅผ ๋์ ๋๋ค. ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ์์์ฑ์ ์ต์ํํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ๋จ๋จํ ๊ฐ์ธ์ผ ํฉ๋๋ค.
์์: ๋ณต์กํ ์๋์ฐจ 3D ๋ชจ๋ธ์ ์์ํด ๋ณด์ธ์. ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์ ์ฒด ์๋์ฐจ ๋ชจ๋ธ์ ๋ ๋๋งํ๋ ๋์ , ์๋์ฐจ๋ฅผ ๊ฐ์ธ๋ ๊ฐ๋จํ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด ๋ฐ์ด๋ฉ ๋ฐ์ค๋ ์ ์ฒด ์๋์ฐจ ๋ชจ๋ธ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ๋ ๋๋ง๋ฉ๋๋ค.
2. ๊ณ์ธต์ ์คํด๋ฃจ์ ์ปฌ๋ง ์ฌ์ฉ
๋ณต์กํ ์ฅ๋ฉด์ ๊ฒฝ์ฐ, ๊ฐ์ฒด๋ฅผ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ๋ ๊ณ์ธต์ ์คํด๋ฃจ์ ์ปฌ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ์์ ์์ค์ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ๋ํด ๋จผ์ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ง์ฝ ์์ ์์ค์ ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ด ๊ฐ๋ ค์ง๋ฉด, ๊ทธ ์์๋ค์ ๋ํ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ์ง ์์๋ ๋ฉ๋๋ค. ์ด๋ ํ์ํ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
์์: ๋์๊ฐ ์๋ ์ฅ๋ฉด์ ์๊ฐํด ๋ณด์ธ์. ๊ฑด๋ฌผ์ ๋ธ๋ก์ผ๋ก, ๋ธ๋ก์ ๊ตฌ์ญ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ตฌ์ญ์ ๋ํด ๋จผ์ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ง์ฝ ํ ๊ตฌ์ญ์ด ๊ฐ๋ ค์ง๋ฉด, ํด๋น ๊ตฌ์ญ ๋ด์ ๊ฐ๋ณ ๋ธ๋ก๊ณผ ๊ฑด๋ฌผ์ ๋ํ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ํผํ ์ ์์ต๋๋ค.
3. ํ๋ ์ ์ผ๊ด์ฑ ํ์ฉ
์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ํ๋ ์ ์ผ๊ด์ฑ์ ๋ณด์ ๋๋ค. ์ฆ, ํ ํ๋ ์์์ ๋ค์ ํ๋ ์์ผ๋ก ๋์ด๊ฐ ๋ ๊ฐ์ฒด์ ๊ฐ์์ฑ์ ๋น์ทํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ํ๋ ์์์ ๊ฐ์ฒด์ ๊ฐ์์ฑ์ ์์ธกํจ์ผ๋ก์จ ์ด ํ๋ ์ ์ผ๊ด์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ํ์ํ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ์ด์ ํ๋ ์์์ ๊ฐ์ฒด๊ฐ ๋ณด์๋ค๋ฉด, ํ์ฌ ํ๋ ์์์๋ ๋ณด์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ๊ฐ์ฒด์ ๋ํ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ (์: ๋ค๋ฅธ ๊ฐ์ฒด ๋ค๋ก ์ด๋ํ ๋์ฒ๋ผ) ๊ฐ๋ ค์ง ๊ฐ๋ฅ์ฑ์ด ์๊ธธ ๋๊น์ง ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
4. ๋ณด์์ ์คํด๋ฃจ์ ์ฌ์ฉ ๊ณ ๋ ค
์ง์ฐ ์๊ฐ์ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด, ์์ฃผ ์ ์ ์์ ํ๋๊ทธ๋จผํธ๋ง ๋ณด์ด๋๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๋ณด์์ ์คํด๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์๊ณ๊ฐ์ ์ค์ ํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์๊ณ๊ฐ๋ณด๋ค ๋์ผ๋ฉด ๊ฐ์ฒด๋ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ๋ ค์ง ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์: 10๊ฐ์ ํ๋๊ทธ๋จผํธ๋ฅผ ์๊ณ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ 10๋ณด๋ค ํฌ๋ฉด ๊ฐ์ฒด๋ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ๋ ค์ง ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ ์ ํ ์๊ณ๊ฐ์ ์ฅ๋ฉด์ ๊ฐ์ฒด ํฌ๊ธฐ์ ๋ณต์ก์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
5. ๋์ฒด ๋ฉ์ปค๋์ฆ ๊ตฌํ
๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ํ๋์จ์ด๊ฐ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ์ฌ์ฉํ ์ ์๋ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ๋ ๊ฐ๋จํ ์คํด๋ฃจ์ ์ปฌ๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ฑฐ๋ ์คํด๋ฃจ์ ์ปฌ๋ง์ ์์ ํ ๋นํ์ฑํํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
์์: EXT_occlusion_query_boolean ํ์ฅ์ด ์ง์๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ง์๋์ง ์๋ ๊ฒฝ์ฐ, ์นด๋ฉ๋ผ์์ ๋๋ฌด ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ง ์๋ ๊ฐ๋จํ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ์ปฌ๋ง ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
6. ๋ ๋๋ง ํ์ดํ๋ผ์ธ ์ต์ ํ
์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ๋ผ๋ ํผ์ฆ์ ํ ์กฐ๊ฐ์ผ ๋ฟ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋๋จธ์ง ๋ถ๋ถ๋ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋๋ก์ฐ ์ฝ ์ ์ค์ด๊ธฐ: ๋๋ก์ฐ ์ฝ์ ์ผ๊ด ์ฒ๋ฆฌํ๋ฉด ๋ ๋๋ง ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ ์ ฐ์ด๋ ์ฌ์ฉ: ์ ฐ์ด๋๋ฅผ ์ต์ ํํ๋ฉด ๊ฐ ์ ์ ๋ฐ ํ๋๊ทธ๋จผํธ ์ฒ๋ฆฌ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
- ๋ฐ๋งคํ ์ฌ์ฉ: ๋ฐ๋งคํ์ ํ ์ค์ฒ ํํฐ๋ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ค๋ฒ๋๋ก์ฐ ์ค์ด๊ธฐ: ์ค๋ฒ๋๋ก์ฐ๋ ํ๋๊ทธ๋จผํธ๊ฐ ์๋ก ๊ฒน์ณ ๊ทธ๋ ค์ ธ ์ฒ๋ฆฌ ์๊ฐ์ ๋ญ๋นํ ๋ ๋ฐ์ํฉ๋๋ค.
- ์ธ์คํด์ฑ ์ฌ์ฉ: ์ธ์คํด์ฑ์ ์ฌ์ฉํ๋ฉด ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋์ผํ ๊ฐ์ฒด์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ๋ ๋๋งํ ์ ์์ต๋๋ค.
7. ๋น๋๊ธฐ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฒ์
GPU๊ฐ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ๋ง์น์ง ์์ ์ํ์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ฉด ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋น๋๊ธฐ์ ๊ฒ์ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ๋ฉด ์ด๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ธฐ์ ์ ์ผ๋ก๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๊ธฐ ์ ์ ์ผ์ ์์ ํ๋ ์์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋, ์ฟผ๋ฆฌ ๊ฒ์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ฉ ์์ปค ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ ๋ ๋๋ง ์ค๋ ๋๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์ฝ๋ ์์ : ๊ธฐ๋ณธ์ ์ธ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ ๊ตฌํ
๋ค์์ WebGL์์ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ฐ๋ตํ๋ ์์ ์ ๋๋ค:
// ์ฟผ๋ฆฌ ๊ฐ์ฒด ์์ฑ
const query = gl.createQuery();
// ์ฟผ๋ฆฌ ์์
gl.beginQuery(gl.ANY_SAMPLES_PASSED, query);
// ๊ฐ์ฒด ๋ ๋๋ง (์: ๋ฐ์ด๋ฉ ๋ฐ์ค)
gl.drawArrays(gl.TRIANGLES, 0, vertexCount);
// ์ฟผ๋ฆฌ ์ข
๋ฃ
gl.endQuery(gl.ANY_SAMPLES_PASSED);
// ๋น๋๊ธฐ์ ์ผ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฒ์ (requestAnimationFrame ์ฌ์ฉ ์์)
function checkQueryResult() {
gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE, (available) => {
if (available) {
gl.getQueryParameter(query, gl.QUERY_RESULT, (result) => {
const isVisible = result > 0;
// ๊ฐ์์ฑ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ์ง ๊ฒฐ์
if (isVisible) {
renderFullObject();
}
});
} else {
requestAnimationFrame(checkQueryResult);
}
});
}
requestAnimationFrame(checkQueryResult);
์ฐธ๊ณ : ์ด๋ ๊ฐ๋ตํ๋ ์์์ด๋ฉฐ ์ค๋ฅ ์ฒ๋ฆฌ, ์ ์ ํ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋๋ ๊ณ ๊ธ ์ต์ ํ ๊ธฐ์ ์ ํฌํจํ์ง ์์ต๋๋ค. ํน์ ์ฅ๋ฉด๊ณผ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ด๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค. ํนํ ํ์ฅ ์ง์ ๋ฐ ์ฟผ๋ฆฌ ๊ฐ์ฉ์ฑ์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์ํ ์ ์ฌ์ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์กฐ์ ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์คํด๋ฃจ์ ์ฟผ๋ฆฌ
์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ด๋ฒ์ํ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค:
- ๊ฒ์ ๊ฐ๋ฐ: ์คํด๋ฃจ์ ์ปฌ๋ง์ ํนํ ๊ฐ์ฒด๊ฐ ๋ง์ ๋ณต์กํ ์ฅ๋ฉด์์ ๊ฒ์์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ค์ํ ๊ธฐ์ ์ ๋๋ค. WebAssembly์ WebGL์ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง๋๋ AAA ํ์ดํ ๊ฒ์์ด๋ ์์ธํ ํ๊ฒฝ์ ๊ฐ์ง ์น ๊ธฐ๋ฐ ์บ์ฃผ์ผ ๊ฒ์ ๋ฑ์ด ๊ทธ ์์ ๋๋ค.
- ๊ฑด์ถ ์๊ฐํ: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๊ฑด์ถ ์๊ฐํ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ด ์ฌ์ฉ์๊ฐ ํฌ๊ณ ์์ธํ ๊ฑด๋ฌผ ๋ชจ๋ธ์ ์ค์๊ฐ์ผ๋ก ํ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ง์ ์ ์๋ฌผ์ด ์๋ ๊ฐ์ ๋ฐ๋ฌผ๊ด์ ํํํ๋ ๊ฒ์ ์์ํด ๋ณด์ธ์ - ์คํด๋ฃจ์ ์ปฌ๋ง์ ๋ถ๋๋ฌ์ด ํ์์ ๋ณด์ฅํฉ๋๋ค.
- ์ง๋ฆฌ ์ ๋ณด ์์คํ (GIS): ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋์ ๋ฐ ํ๊ฒฝ๊ณผ ๊ฐ์ ํฌ๊ณ ๋ณต์กํ ์ง๋ฆฌ ๋ฐ์ดํฐ ์ธํธ์ ๋ ๋๋ง์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ ๊ณํ ์๋ฎฌ๋ ์ด์ ์ ์ํด ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ๋์ ๊ฒฝ๊ด์ 3D ๋ชจ๋ธ์ ์๊ฐํํ๋ ๊ฒ์ ์คํด๋ฃจ์ ์ปฌ๋ง์ผ๋ก๋ถํฐ ํฐ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
- ์๋ฃ ์์: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ์๋ฃ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์์ผ ์์ฌ๊ฐ ๋ณต์กํ ํด๋ถํ์ ๊ตฌ์กฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์๊ฐํํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์ ์์๊ฑฐ๋: ์ ํ์ 3D ๋ชจ๋ธ์ ์ ๊ณตํ๋ ์น์ฌ์ดํธ์ ๊ฒฝ์ฐ, ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ GPU ๋ถํ๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น์์๋ ๋ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋ณต์กํ ๊ฐ๊ตฌ์ 3D ๋ชจ๋ธ์ ๋ณด๋ ๊ฒ์ ์๊ฐํด ๋ณด์ธ์; ์คํด๋ฃจ์ ์ปฌ๋ง์ ํฉ๋ฆฌ์ ์ธ ํ๋ ์ ์๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ ค์ง ๊ฐ์ฒด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ปฌ๋งํจ์ผ๋ก์จ ๋ ๋๋ง ๋ถํ๋ฅผ ์ค์ด๊ณ , ํ๋ ์ ์๋๋ฅผ ๋์ด๋ฉฐ, ๋ ๋ณต์กํ๊ณ ์์ธํ ์ฅ๋ฉด์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ง์ฐ ์๊ฐ ๋ฐ ์ฟผ๋ฆฌ ์ค๋ฒํค๋์ ๊ฐ์ ๊ณ ๋ คํด์ผ ํ ๊ณผ์ ๊ฐ ์์ง๋ง, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ฉด ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ ์ ์์ต๋๋ค. ์ ์ธ๊ณ์ ๊ฐ๋ฐ์๋ค์ ์ด๋ฌํ ๊ธฐ์ ์ ์๋ฌํจ์ผ๋ก์จ ๋ ํ๋ถํ๊ณ ๋ชฐ์ ๊ฐ ์์ผ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ๊ธฐ๋ฐ 3D ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ถ๊ฐ ์๋ฃ
- WebGL ์ฌ์: ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ๋ํ ์ต์ ์ ๋ณด๋ ๊ณต์ WebGL ์ฌ์์ ์ฐธ์กฐํ์ญ์์ค.
- ํฌ๋ก๋ ธ์ค ๊ทธ๋ฃน(Khronos Group): WebGL ๋ฐ OpenGL ES์ ๊ด๋ จ๋ ์๋ฃ๋ ํฌ๋ก๋ ธ์ค ๊ทธ๋ฃน์ ์น์ฌ์ดํธ๋ฅผ ํ์ํ์ญ์์ค.
- ์จ๋ผ์ธ ํํ ๋ฆฌ์ผ ๋ฐ ๊ธฐ์ฌ: ์ค์ ์์ ์ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ณด๋ ค๋ฉด WebGL ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ๋ํ ์จ๋ผ์ธ ํํ ๋ฆฌ์ผ๊ณผ ๊ธฐ์ฌ๋ฅผ ๊ฒ์ํ์ญ์์ค.
- WebGL ๋ฐ๋ชจ: ์ค์ ๊ตฌํ ์ฌ๋ก๋ฅผ ๋ฐฐ์ฐ๋ ค๋ฉด ์คํด๋ฃจ์ ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๊ธฐ์กด WebGL ๋ฐ๋ชจ๋ฅผ ์ดํด๋ณด์ญ์์ค.